/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controller;

import Exceptions.ConfigFileNotLoadedException;
import Exceptions.InvalidGraphException;
import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Vector;

/**
 *
 * @author subx
 */
public class SRCFacade implements ISRCFacade {
    private static SRCFacade instance = null;

    private Vector<Color> colors;

    private ConfigReader reader;
    
    private SRCFacade(){
        initColors();
    }

    public static SRCFacade getInstance(){
        if(instance == null)
            instance = new SRCFacade();

        return instance;
    }

    private void initColors() {
        colors = new Vector<Color>();

        colors.add(Color.RED);
        colors.add(Color.BLACK);
        colors.add(Color.BLUE);
        colors.add(Color.CYAN);
        colors.add(Color.DARK_GRAY);
        colors.add(Color.GRAY);
        colors.add(Color.GREEN);
        colors.add(Color.MAGENTA);
        colors.add(Color.ORANGE);
        colors.add(Color.PINK);
        colors.add(Color.YELLOW);
    }

    public String[] getInfos() throws ConfigFileNotLoadedException {
        Config config = Config.getInstance();
        List<String> tmp = config.getInfo();
        String[] result;

        if(tmp == null)
            throw new ConfigFileNotLoadedException("Arquivo de configuração ainda não foi carregado!");
        else{
            Integer i;

            //Quantidade de nós
            i = new Integer(config.getNodes());
            tmp.add(i.toString());
            //Qunatidade de arestas
            i = config.getEdges();
            tmp.add(i.toString());
            //Distância total
            i = config.getTotalDist();
            tmp.add(i.toString());
            //Peso total do grafo
            i = config.getTotalWeight();
            tmp.add(i.toString());

            result = new String[tmp.size()];

            for(String s : tmp){
                result[i] = tmp.get(i);
                i++;
            }

            return result;
        }
    }

    public void disposeConfig() throws ConfigFileNotLoadedException {
        if(Config.getInstance().wasLoaded())
            throw new ConfigFileNotLoadedException("Arquivo de configuração ainda não foi carregado!");
        else
            Config.getInstance().dispose();
            
    }

    public List<Node> getNodes() throws ConfigFileNotLoadedException {
        if(Config.getInstance().wasLoaded())
            throw new ConfigFileNotLoadedException("Arquivo de configuração ainda não foi carregado!");
        
        return Config.getInstance().getGraph().getNodes();

    }

    public void loadConfig(File file) throws FileNotFoundException{
        try{
            reader = new ConfigReader(file);
            
            reader.ReadConfigFile();
        }catch(IOException ex){
            System.out.println(this.getClass() + ex.getMessage());
            ex.printStackTrace();
        }

    }

    public File getConfigFile() throws ConfigFileNotLoadedException {
        if(reader == null)
            throw new ConfigFileNotLoadedException("Arquivo de configurações ainda não foi carregado!");
        
        return reader.getFile();
        
    }

    public List<List<Edge>> getEdges() throws ConfigFileNotLoadedException {
        if(Config.getInstance().wasLoaded())
            throw new ConfigFileNotLoadedException("Arquivo de configurações ainda não foi carregado!");

        return Config.getInstance().getGraph().getMatrix();
    }

    public boolean checkgraph() throws InvalidGraphException {
        if (Config.getInstance().getGraph().isEulerian()) {
            return true;
        }
        else {
            throw new InvalidGraphException();
        }
    }

    public void play(int maxDist) {
        AVLTree<Integer, Carteiro> tree = new AVLTree<Integer, Carteiro>();
        tree = Config.getInstance().getGraph().divideCarteiros(maxDist);
        tree.printAVL(tree.getRoot());
    }

}
